package com.haiwei.poi.common.regex;


/**
 * 常用正则表达式.
 */
public interface HaiweiRegexConstant {


    /*
     * 一、校验数字的表达式
     */

    /** 1. 数字 */
    String NUMBER = "^[0-9]*$";

    /** 2. n位的数字 */
    String N_BIT_NUMBER = "^\\d{n}$";

    /** 3. 至少n位的数字 */
    String NUMBERS_WITH_AT_LEAST_N_BITS = "^\\d{n,}$";

    /** 4. m-n位的数字 */
    String M_N_DIGITS = "^\\d{m,n}$";

    /** 5. 零和非零开头的数字 */
    String NUMBERS_WITH_ZERO_AND_NON_ZERO_BEGINNINGS = "^(0|[1-9][0-9]*)$";

    /** 6. 非零开头的最多带两位小数的数字 */
    String NUMBERS_MAXIMUM_TWO_DECIMAL_DIGITS_NON_ZERO_BEGINNING = "^([1-9][0-9]*)+(.[0-9]{1,2})?$";

    /** 7. 带1-2位小数的正数或负数 */
    String POSITIVE_OR_NEGATIVE_NUMBERS_WITH_1_2_DECIMAL_DIGITS = "^(\\-)?\\d+(\\.\\d{1,2})?$";

    /** 8. 正数、负数、和小数 */
    String POSITIVE_NEGATIVE_DECIMAL_NUMBERS = "^(\\-|\\+)?\\d+(\\.\\d+)?$";

    /** 9. 有两位小数的正实数 */
    String POSITIVE_REAL_NUMBERS_OF_TWO_DECIMAL = "^[0-9]+(.[0-9]{2})?$";

    /** 10. 有1~3位小数的正实数 */
    String POSITIVE_REAL_NUMBERS_1_3_DIGIT_DECIMALS = "^[0-9]+(.[0-9]{1,3})?$";

    /** 11. 非零的正整数 */
    String NONZERO_POSITIVE_INTEGERS = "^[1-9]\\d*$";

    /** 12. 非零的负整数 */
    String NONZERO_NEGATIVE_INTEGERS = "^-[1-9]\\d*$";

    /** 13. 非负整数 */
    String NONNEGATIVE_INTEGER = "^[1-9]\\d*|0$";

    /** 14. 非正整数 */
    String NON_POSITIVE_INTEGER = "^-[1-9]\\d*|0$";

    /** 15. 非负浮点数 */
    String NON_NEGATIVE_FLOATING_POINT_NUMBER = "^[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+|0$";

    /** 16. 非正浮点数 */
    String NON_POSITIVE_FLOATING_POINT_NUMBER = "^(-([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*))|0?\\.0+|0$";

    /** 17. 正浮点数 */
    String POSITIVE_FLOATING_POINT = "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$";

    /** 18. 负浮点数 */
    String NEGATIVE_FLOATING_POINT_NUMBER = "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$";

    /** 19. 浮点数 */
    String FLOATING_POINT_NUMBER = "^-?([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+|0)$";

    /*
     * 二、校验字符的表达式
     */

    /** 1. 汉字 */
    String CHINESE_CHARACTERS = "^[\\u4e00-\\u9fa5]{0,}$";

    /** 2. 英文和数字 */
    String ENGLISH_AND_FIGURES = "^[A-Za-z0-9]+$";

    /** 3. 长度为3-20的所有字符 */
    String ALL_CHARACTERS_OF_LENGTH_3_20 = "^.{3,20}$";

    /** 4. 由26个英文字母组成的字符串 */
    String ENGLISH_ALPHABET = "^[A-Za-z]+$";

    /** 5. 由26个大写英文字母组成的字符串 */
    String CAPITAL_ENGLISH_LETTERS = "^[A-Z]+$";

    /** 6. 由26个小写英文字母组成的字符串 */
    String LOWERCASE_ENGLISH_LETTERS = "^[a-z]+$";

    /** 7. 由数字和26个英文字母组成的字符串 */
    String DIGITAL_ENGLISH_ALPHABET = "^[A-Za-z0-9]+$";

    /** 8. 由数字、26个英文字母或者下划线组成的字符串 */
    String DIGITAL_ENGLISH_ALPHABET_UNDERLINE = "^\\w+$";

    /** 9. 中文、英文、数字包括下划线 */
    String CHINESE_DIGITAL_ENGLISH_ALPHABET_UNDERLINE = "^[\\u4E00-\\u9FA5A-Za-z0-9_]+$";

    /** 10. 中文、英文、数字但不包括下划线等符号 */
    String CHINESE_DIGITAL_ENGLISH_ALPHABET = "^[\\u4E00-\\u9FA5A-Za-z0-9]+$";

    /** 11. 可以输入含有^%&',;=?$\"等字符 */
    String SPECIAL_SYMBOLS = "[^%&',;=?$\\x22]+";

    /** 12. 禁止输入含有~的字符 */
    String PROHIBIT_WAVY_LINE = "[^~\\x22]+";

    /*
     * 三、特殊需求表达式
     */

    /** 1. Email地址 */
    String EMAIL = "^$|^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";

    /** 2. 域名 */
    String DOMAIN = "[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?";

    /** 3. InternetURL */
    String INTERNET_URL = "^$|^http://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$";

    /** 4. 手机号码 */
    String PHONE = "^$|^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9]|17[0|1|2|3|4|5|6|7|8]|19[1|8|9])\\d{8}$";

    /** 5. 电话号码 ("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX)*/
    String TELEPHONE= "^$|^(\\d{3,4}-)?\\d{7,8}$";

    /** 6. 国内电话号码(0511-4405222、021-87888822) */
    String DOMESTIC_TELEPHONE = "^$|^\\d{3}-\\d{8}|\\d{4}-\\d{7}$";

    /** 7. 身份证号(15位、18位数字) */
    String ID_NUMBER = "^\\d{15}|\\d{18}$";

    /** 8. 短身份证号码(数字、字母x结尾) */
    String SHORT_ID_NUMBER = "^\\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$";

    /** 9. 密码(8-16位数字、字母混合) */
    String PASSWORD = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$";

    /** 10. 日期格式 */
    String DATE_FORMAT = "^\\d{4}-\\d{1,2}-\\d{1,2}";

    /** 11. 腾讯QQ号 */
    String QQ = "^$|^[1-9][0-9]{4,9}$";

    /** 12. 中国邮政编码 */
    String CHINA_POSTAL_CODE = "^$|^\\d{6}$";

    /** 13. 图片路径 */
    String URL_IMAGE = "^(http://)?([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?(.JPEG|.jpeg|.JPG|.jpg|.GIF|.gif|.PNG|.png)$";

    /** 14. ID_NO */
    String ID_NO = "((11|12|13|14|15|21|22|23|31|32|33|34|35|36|37|41|42|43|44|45|46|50|51|52|53|54|61|62|63|64|65)[0-9]{4})(([1|2][0-9]{3}[0|1][0-9][0-3][0-9][0-9]{3}[X0-9])|([0-9]{2}[0|1][0-9][0-3][0-9][0-9]{3}))";

    /** 15. IP */
    String IP = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\\-]*[A-Za-z0-9])$|^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$";

    /** 16. 短日期 */
    String SHORT_DATE = "^\\d{4}[\\-](0?[1-9]|1[012])[\\-](0?[1-9]|[12][0-9]|3[01])$";

    /** 17. 长日期 */
    String LONG_DATE = "^\\d{4}[\\-](0?[1-9]|1[012])[\\-](0?[1-9]|[12][0-9]|3[01]) (?:2[0-3]|[01]?[0-9]):[0-5][0-9]:[0-5][0-9]$";

    /** 18. 颜色 */
    String COLOR = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$";

    /** 19. 传真 */
    String FAX = "^$|^(\\d{3,4}-)?\\d{7,8}$";

    /** 20. 联系电话 */
    String CONTACT_NUMBER = "^$|^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$|^(\\d{3,4}-)?\\d{7,8}$";

    /**
     * 用户密码（匹配8-16位，至少有一个大写字母和一个特殊数字，特殊字符包括~!@&$%^*()_#）
     */
    String PASS_WORD = "^(?=.*[A-Z])(?=.*[~!@&%$^\\(\\)#_])[A-Z0-9~!@&%$^\\(\\)#_]{8,16}$";

}
